﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Sistema_Totem.Datos.SqlServer;
using Sistema_Totem.Datos.ClasesDominio;
using Sistema_Totem.Logica.Excepciones;

namespace Sistema_Totem.Logica.Clases
{
    public class Proyecto
    {
        public int Codigo { get; set; }
        public string Nombre { get; set; }
        public string Area { get; set; }

        public Int32 IdProyecto { get; set; }
        public string Codigos { get; set; }
        public string Nombres { get; set; }
        public DateTime FechaInicio { get; set; }
        public DateTime FechaFin { get; set; }
        public string Descripcion { get; set; }
        public string Status { get; set; }

        #region Atributo/Encapsulamiento/Constructor  Grupo 1 - Propuesta

        private Propuesta propuestaProy;  //Atributo asociado a la propuesta del proyecto     

        public Propuesta PropuestaProy
        {
            get { return propuestaProy; }
            set { propuestaProy = value; }
        }

        public Proyecto(Propuesta documnetoPropuesta)
        {
            this.propuestaProy= documnetoPropuesta;
        }

        #endregion Atributos Definidos por Grupo 1

        #region Constructor
        public Proyecto() { }

        public Proyecto(string codigo, string nombre, DateTime fechai, DateTime fechaf, string descripcion, string status, string area)
        {
            this.Codigos = codigo;
            this.Nombres = nombre;
            this.FechaInicio = fechai;
            this.FechaFin = fechaf;
            this.Descripcion = descripcion;
            this.Status = status;
            this.Area = area;
        }
        #endregion Constructor

        #region Listar Todos los proyectos
        public List<Proyecto> ListarProyectos()
        {
            try
            {
                List<Proyecto> datos = new SqlServerProyecto().ConsultarProyectos();
                return datos;
            }
            catch (Exception e)
            {
                throw e;
            }
        }
        #endregion Listar Todos los proyectos

        #region Agregar Proyecto
        public void AgregarProyecto(Proyecto proyecto, List<Int32> idplantilla, List<Int32> involucrados, Int32 cliente)
        {
            try
            {
                SqlServerProyecto proyect = new SqlServerProyecto();
                proyect.AgregarProyecto(proyecto); //agrego el proyecto en la base de datos

                //consultamos el id del proyecto que acabamos de crear
                int idproyecto = BuscarUltimoIdProyecto(); //le asignamos el id del ultimo proyecto que se consulto

                //recorremos la lista de las plantillas y las insertamos en PROYECTO_PLANTILLA
                for (int i = 0; i < idplantilla.Count; i++)
                {
                    //se llama a a la clase SqlServerProyecto y se va insertando en la tabla Proyecto_plantilla
                    proyect.AgregarPlantillaProyecto(idplantilla[i],idproyecto); 
                }

                //
                //Aqui va el insertar involucrados que tiene que consultar si tiene que insertar de nuevo el empleado o simplemente 
                //tiene que hacer update sobre la base de datos.
                //si tiene proyectos y este termino, entonces lo inserto de nuevo
                //si esta ccreado y tiene NULL en cliente y proyecto entonces hace un update
                //
                for (int i = 0; i < involucrados.Count; i++)
                {
                    //se llama a a la clase SqlServerProyecto y se va insertando en la tabla Proyecto_plantilla
                    proyect.AgregarInvolucradoProyecto(involucrados[i], idproyecto, cliente);
                }


            }
            catch (Exception e)
            {
                throw e;
            }
           
        }

        public void ActualizarFecha(int idproyecto)
        {
            try
            {
                SqlServerProyecto proy = new SqlServerProyecto();
                proy.ModificarProyectoInsertado(idproyecto);
            }
            catch (Exception e)
            {
                throw e;
            }
        }
        #endregion Agregar Proyecto

        #region Modificar Proyecto
        public void ModificarProyecto(Proyecto proyecto, List<Int32> involucrados)
        {
            try
            {
                SqlServerProyecto proyect = new SqlServerProyecto();
                proyect.ModificarProyecto(proyecto); //modificamos el proyecto en la base de datos
                for (int i = 0; i < involucrados.Count; i++)
                {
                    //se llama a a la clase SqlServerProyecto y se va insertando en la tabla Proyecto_plantilla
                    proyect.ModificarListaInvolucradosProyecto(involucrados[i], proyecto.IdProyecto);
                }

            }
            catch (Exception e)
            {
                throw e;
            }

        }
        
        #endregion Modificar Proyecto

        public List<Involucrado> ConsultartodosTodosInvolucrado()
        {
            SqlServerProyecto serverInvolucrado = new SqlServerProyecto();
            try
            {
                return serverInvolucrado.ConsultarInvolucrados();
            }
            catch (NullReferenceException error)
            {
                throw (new Exception("El valor que devuelve la lista es vacio", error));
            }
        }
      
        #region Consultar Detalle Proyecto
        public Proyecto ConsultarDetalleProyecto(int datos)
        {
            try
            {
                Proyecto proy = new SqlServerProyecto().ConsultarDetalleProyecto(datos);
                return proy;
            }
            catch (Exception e)
            {
                throw e;
            }
        }
        #endregion Consultar Detalle Proyecto

        #region Consultar Detalle Proyecto 1
        public Proyecto ConsultarDetalleProyecto1(int datos)
        {
            try
            {
                List<Proyecto> proyect = ListarProyectos();
                for (int i = 0; i < proyect.Count; i++)
                {
                    Proyecto proy = proyect[i];
                    if (proy.IdProyecto == datos) { return proy; }
                }
                return null;
            }
            catch (Exception e)
            {
                throw e;
            }
        }
        #endregion Consultar Detalle Proyecto

        #region Generar Codigo del Proyecto
        public string CodigoProyecto()
        {
            try
            {
                List<Proyecto> datos = ListarProyectos();
                int h = datos.Count+1;
                return "TOT-" + h;
            }
            catch (Exception e)
            {
                throw new Exception("Error al buscar el codigo", e);
            }

        }

        #endregion Generar Codigo del Proyecto

        #region Buscar Ultimo id del Proyecto
        public int BuscarUltimoIdProyecto()
        {
            try
            {
                List<Proyecto> datos = ListarProyectos();
                int h = datos.Count - 1;
                int w = datos[h].IdProyecto;
                return w;
            }
            catch (Exception e)
            {
                throw new Exception("Error al buscar el ultimo proyecto", e);
            }

        }
        #endregion Buscar Ultimo id del Proyecto

        #region Buscar No Involucrados
        public List<Involucrado> BuscarNoInvolucrados(int idproy)
        {
            try
            {
                List<Involucrado> invol = new SqlServerProyecto().ConsultarNoInvolucrados(idproy);
                return invol;
            }
            catch (Exception e) { throw e; }
        }
        #endregion Buscar No Involucrados

        #region Buscar Involucrados
        public List<Involucrado> BuscarInvolucrados(int idproy)
        {
            try
            {
                List<Involucrado> invol = new SqlServerProyecto().ConsultarInvolucrados(idproy);
                return invol;
            }
            catch (Exception e) { throw e; }
        }
        #endregion Buscar No Involucrados

        #region Buscar Clientes
        public Cliente BuscarCliente(int idproy)
        {
            try
            {
                Cliente cliente = new SqlServerProyecto().ConsultarCliente(idproy);
                return cliente;
            }
            catch (Exception e) { throw e; }
        }
        #endregion Buscar Clientes

        #region Buscar Plantillas
        public String BuscarPlantilla(int idplantilla, int idproy)
        {
            try
            {
                String plant = new SqlServerProyecto().ConsultarPlantillaProyecto(idplantilla,idproy);
                return plant;
            }
            catch (Exception e) { throw e; }
        }
        #endregion Buscar Clientes

        #region Cerrar Proyecto
        public void Cerrar(int idproy)
        {
            try
            {
                SqlServerProyecto proy = new SqlServerProyecto();
                proy.CerrarProyecto(idproy);   
            }
            catch (Exception e) { throw e; }
        }
        #endregion Buscar Clientes

        #region Cambiar Contrasena LOGIN
        public void CambiarContrasena(String usuario, String clave)
        {
            try
            {
                SqlServerProyecto proy = new SqlServerProyecto();
                proy.CambiarClave(usuario, clave);
            }
            catch (Exception e)
            {
                throw new Exception("Error al cambiar la clave", e);
            }

        }
        #endregion Cambiar Contrasena LOGIN

      #region Grupo 1 - Verificar si Existe Propuesta del Proyecto

        public bool VerificarPropuestaProyecto()
        {
            try
            {
                SqlServerPropuesta acceso = new SqlServerPropuesta();
                bool auxiliar;
                auxiliar = acceso.VerificarPropuesta(IdProyecto);
                return auxiliar;
            }

            catch (Exception)
            {
                throw (new PropuestaExcepcion("Error Inesperado al Verificar Propuesta"));   
            }
        }      

        #endregion Grupo 1 - Verificar si Existe Propuesta del Proyecto
    }
}